package P006_ElongateMethod;

import org.junit.Test;

/**
 * 覆写变长方法也循规蹈矩
 * @author xufy1
 */
public class ElongateMethod {


    /**
     *  1. 重写不能缩小访问权限
     * 2. 参数列表必须与被重写方法相同
     * 3. 返回类型必须与被重写方法的相同或是子类
     * 4. 重写方法不能抛出新的异常，或者超出父类方位的异常，但是可以抛出更少的异常，
     * 或者不抛异常
     */

    @Test
    public  void test1() {
        //上转型,形参列表有父类决定
        Base base=new Sub();
        base.fun(100,50);
        //不转型，形参有子类决定
        Sub sub = new Sub();
        int[] a=null;
//        sub.fun(100,50);
//        sub.fun(100,a);
    }

}
class Base{
    public void fun(int price,int... discounts) throws NullPointerException{
        System.out.println("base ... fun");
    }
}
class Sub extends Base{
    /**
     * 发生在不同的类当中，并且两者要有继承关系，
     * 重写是方法名字和参数的列表是要完全一致的
     */
    @Override
    public void fun(int price, int[] discounts) throws NullPointerException{
        System.out.println("sub ... fun");
    }

    /**
     * 重载就是在同一个类当中有多个名称相同方法，但各个相同方法的参数列表不同（无关返回值类型）
     */
    public void fun(int a,int price, int[] discounts){
        System.out.println("sub ... fun");
    }
}